package com.xiu.java8.functionalinterface;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class FunctionalInterfaceTest2 {

	public static void main(String[] args) {
		GreetingService greetService1 = message->System.out.println(message);
		greetService1.sayMessage("hello");
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
		// Predicate<Integer> predicate = n -> true
	    // n 是一个参数传递到 Predicate 接口的 test 方法
	    // n 如果存在则 test 方法返回 true
		System.out.println("输出所有数据:");
	    eval(list, n->true);
	    // Predicate<Integer> predicate1 = n -> n%2 == 0
	    // n 是一个参数传递到 Predicate 接口的 test 方法
	    // 如果 n%2 为 0 test 方法返回 true
	    System.out.println("输出所有偶数:");
	    eval(list,n->n%2==0);
	 // Predicate<Integer> predicate2 = n -> n > 3
	      // n 是一个参数传递到 Predicate 接口的 test 方法
	      // 如果 n 大于 3 test 方法返回 true
	        
	      System.out.println("输出大于 3 的所有数字:");
	      eval(list, n-> n > 3 );
	      list.stream().filter(n -> n > 3).forEach(System.out::println);
	}
	
	public static void eval(List<Integer> list,Predicate<Integer> predicate){
		for (Integer integer : list) {
			if(predicate.test(integer)){
				System.out.println(integer+" ");
			}
		}
	}

}
//加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响，该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法
@FunctionalInterface
interface GreetingService {
    void sayMessage(String message);
//    void sayMessage();
    //函数式接口里允许定义默认方法
    default void doSomeMoreWork1()
    {
        // Method body
    }
    //函数式接口里允许定义静态方法
    static void printHello(){
        System.out.println("Hello");
    }
    //函数式接口里允许定义 java.lang.Object 里的 public 方法
    @Override
    public boolean equals(Object obj);
}